package br.com.sadim.web;

import java.io.IOException;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import org.apache.axis.AxisFault;
import org.apache.axis.client.Service;

import com.drerp.integracao.service.Medico;
import com.drerp.integracao.service.MedicosService;
import com.drerp.integracao.service.MedicosServiceServiceLocator;
import com.drerp.integracao.service.MedicosServiceServiceSoapBindingStub;

import br.com.drerp.financeiro.service.FinanceiroServiceImpl;
import br.com.drerp.financeiro.service.FinanceiroServiceImplServiceLocator;
import br.com.drerp.financeiro.service.FinanceiroServiceImplServiceSoapBindingStub;
import br.com.drerp.financeiro.service.PlanoSaude;
import br.com.drerp.financeiro.service.Procedimento;
import br.com.drerp.financeiro.service.TipoProcedimento;
import br.com.sadim.hospital.Consulta;
import br.com.sadim.hospital.ConsultaRN;
import br.com.sadim.hospital.HoraConsulta;
import br.com.sadim.hospital.ProcedimentoConsulta;
import br.com.sadim.hospital.ProcedimentoConsultaRN;
import br.com.sadim.hospital.StatusConsulta;
import br.com.sadim.hospital.TipoProcedimentoConsulta;
import br.com.sadim.hospital.TipoUsuario;
import br.com.sadim.hospital.Usuario;
import br.com.sadim.hospital.UsuarioRN;
import br.com.sadim.paciente.Paciente;
import br.com.sadim.paciente.PacienteRN;


@ManagedBean(name="consultaBean")
@RequestScoped
public class ConsultaBean implements Serializable {

	private static final long serialVersionUID = 1L;
	private Consulta consulta = new Consulta();
	private List<Consulta> lista;
	private List<Consulta> listaFinalizadas;
	private List<Consulta> listaPorMedico;
	private ConsultaRN consultaRN = new ConsultaRN();
	private UsuarioRN usuarioRN = new UsuarioRN();
	private PacienteRN pacienteRN = new PacienteRN();
	private ProcedimentoConsultaRN procedimentoRN = new ProcedimentoConsultaRN();
	private Integer medicoSelecionado;
	private Integer pacienteSelecionado;
	private SessaoBean sessaoBean = new SessaoBean();
	

	
	private boolean statusConfirmar;
	
	


	public Integer getPacienteSelecionado() {
		return pacienteSelecionado;
	}

	public void setPacienteSelecionado(Integer pacienteSelecionado) {
		this.pacienteSelecionado = pacienteSelecionado;
	}

	public void setLista(List<Consulta> lista) {
		this.lista = lista;
	}
	
	public void setListaPorMedico(List<Consulta> lista) {
		this.listaPorMedico = lista;
	}

	public String salvar() {
		FacesContext context = FacesContext.getCurrentInstance();
		//Cliente confirma consulta
		if(this.statusConfirmar) {
			consulta.setStatus(StatusConsulta.CONFIRMADA);
			this.statusConfirmar = false;
			context.addMessage(null, new FacesMessage("Consulta confirmada"));  
		}
		context.addMessage(null, new FacesMessage("Dados cadastrados com sucesso"));  
		consultaRN.salvar(consulta);
		return "listagemConsultaRecepcionista";
	}
	
	public String agendar() {
		FacesContext context = FacesContext.getCurrentInstance();  
		if(validaDataHorario()) {

	        context.addMessage(null, new FacesMessage("Dados cadastrados com sucesso"));  
			consultaRN.salvar(consulta);
			return "listagemConsultaRecepcionista";
		} 
		context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro", "Medico ja possui consulta neste horario"));  
		return null;
	}
	
	public Date getCurrentHour() {
		return new Date();
	}
	
	public String getToday() {
		DateFormat dateFormat = new SimpleDateFormat("MM/dd/yy");
		Date date = new Date();
		return dateFormat.format(date);
	}

	
	public String confirmarConsulta(){
		setStatusConfirmar(false);
		return "consultaConfirmar";
	}
	
	public String imprimir(){
		try {
			FacesContext.getCurrentInstance().getExternalContext().redirect ("notaFiscal.jsp?id=" + consulta.getIdConsulta().toString());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
		return null;
		}
	
	public String delete(){
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Consulta Excluida",  "Consulta Excluida com sucesso");  
        
        FacesContext.getCurrentInstance().addMessage(null, message);
        consulta.setStatus(StatusConsulta.CANCELADA);
        consultaRN.salvar(consulta);
        
		//consultaRN.delete(consulta);
		return "listagemConsultaRecepcionista";
	}
	
    public String cancelar(){  
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "System Error",  "Please try again later.");  
          
        FacesContext.getCurrentInstance().addMessage(null, message);
        return "listagemConsultaRecepcionista";
    }  
	
    /*
	public String cancelar(){
		this.consulta.setStatus(StatusConsulta.CANCELADA);
		consultaRN.salvar(consulta);
		return "consultaExcluido";
	}
	*/
	public String clienteAguarda(){
		consulta.setStatus(StatusConsulta.CLIENTE_ESPERA);
		consulta.setHoraChegadaPaciente(getCurrentHour());
		consultaRN.salvar(consulta);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage("Dados cadastrados com sucesso"));
		
		return "listagemConsultaRecepcionista";
	}
	
	public String visualizar() {
		return "consultaRecepcionista";
	}	
	
	public SelectItem[] getStatusOptions() {
		SelectItem[] options = new SelectItem[7];
		options[0] = new SelectItem("", "Selecione");
		options[1] = new SelectItem("Agendada", StatusConsulta.AGENDADA.getStatus());
		options[2] = new SelectItem("Confirmada", StatusConsulta.CONFIRMADA.getStatus());
		options[3] = new SelectItem("Aguarda", StatusConsulta.CLIENTE_ESPERA.getStatus());
		options[4] = new SelectItem("Ocorrendo", StatusConsulta.OCORRENDO.getStatus());
		options[5] = new SelectItem("Finalizada", StatusConsulta.FINALIZADA.getStatus());
		options[6] = new SelectItem("Finalizada", StatusConsulta.CANCELADA.getStatus());
        return options;  
    }  

	public List<Consulta> getLista() {
		if(lista==null) {
			lista = consultaRN.getListAgenda();
		}
		return lista;
	}

	
	public List<Consulta> getListaPorMedico() {
		if(listaPorMedico==null) {
			listaPorMedico = consultaRN.getByMedico(sessaoBean.getUsuario().getIdUsuario());
		}
		return listaPorMedico;
	}
	

	public List<Consulta> getListaFinalizadas() {
		if(listaFinalizadas==null) {
			listaFinalizadas = consultaRN.getListConsultasRealizadas();
		}
		return listaFinalizadas;
	}

	public void setListaFinalizadas(List<Consulta> listaFinalizadas) {
		this.listaFinalizadas = listaFinalizadas;
	}

	public String agendarConsulta(){
		setConsulta(new Consulta());
		consulta.setStatus(StatusConsulta.AGENDADA);
		

		return "agendarConsulta";
	}
	
	public List<SelectItem> getListaConvenios() {
		List<SelectItem> convenios = new ArrayList<SelectItem>();
		try {
			FinanceiroServiceImpl service = new FinanceiroServiceImplServiceSoapBindingStub(new URL("http://186.204.148.52:5574/Financeiro/services/FinanceiroServiceImplPort?wsdl"), new FinanceiroServiceImplServiceLocator());
		//	FinanceiroServiceImpl service = new FinanceiroServiceImplServiceSoapBindingStub(new URL("http://172.23.151.170:8080/Financeiro2/services/FinanceiroServiceImplPort?wsdl"), new FinanceiroServiceImplServiceLocator());

			for(PlanoSaude ps : service.listarPlanosSaude()) {
            	convenios.add(new SelectItem(ps.getNome()));
            }

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return convenios;
	}
	
	
	public List<SelectItem> getListaTipoConsulta() {
		List<SelectItem> procedimentos = new ArrayList<SelectItem>();
		try {
			FinanceiroServiceImpl service = new FinanceiroServiceImplServiceSoapBindingStub(new URL("http://186.204.148.52:5574/Financeiro/services/FinanceiroServiceImplPort?wsdl"), new FinanceiroServiceImplServiceLocator());
			//FinanceiroServiceImpl service = new FinanceiroServiceImplServiceSoapBindingStub(new URL("http://172.23.151.170:8080/Financeiro2/services/FinanceiroServiceImplPort?wsdl"), new FinanceiroServiceImplServiceLocator());

			for(Procedimento p : service.listarProcedimentos()) {
				ProcedimentoConsulta pc = new ProcedimentoConsulta();
        		pc.setNome(p.getNome());
        		
        		//Salvo os tipoProcedimento no bd
        		for(TipoProcedimentoConsulta tpc : TipoProcedimentoConsulta.values()) {
        			if(tpc.getTipo().toString().toUpperCase().equals(p.getTipo().toString().toUpperCase())) {
        				pc.setTipo(tpc);
        			}
        		}
        		pc.setIdProcedimentoConsulta(p.getId().intValue());
				procedimentoRN.salvar(pc);
				
				//Preencho a lista para tela
            	if(p.getTipo().equals(TipoProcedimento.PROCEDIMENTO)) {
            		procedimentos.add(new SelectItem(pc.getNome(), pc.getNome()));
            	}
            }

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return procedimentos;
	}
	
	public List<SelectItem> getListaMedicos(){

		List<SelectItem> medicos = new ArrayList<SelectItem>();  
        

        
        
		try {
			MedicosService ms = new MedicosServiceServiceSoapBindingStub(new URL("http://186.204.148.52:5574/RH/services/MedicosServicePort?wsdl"), new MedicosServiceServiceLocator());
			for (Medico m: ms.getMedicos()) {
				Usuario u = new Usuario();
				u.setTipoUsuario(TipoUsuario.MEDICO);
				u.setNome(m.getNome());
				u.setIdUsuario((int)m.getId()+100);
				u.setLogin(m.getLogin());
				u.setSenha(m.getSenha());
				
				usuarioRN.salvar(u);

			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
        for (Usuario u : usuarioRN.getList()) { 
        	if(u.getTipoUsuario().equals(TipoUsuario.MEDICO))
        		medicos.add(new SelectItem(u, u.getNome()));  
        }  
          
		return medicos;	

	}
	
	public List<SelectItem> getListaPacientes(){
		List<SelectItem> pacientes = new ArrayList<SelectItem>();  
        
        for (Paciente u : pacienteRN.getList()) { 
        	pacientes.add(new SelectItem(u, u.getNome()));  
        }  
          
        return pacientes;	
	}
	
	public List<SelectItem> getListaHorarios(){
		List<SelectItem> horarios = new ArrayList<SelectItem>();  
        for (HoraConsulta h : HoraConsulta.values()) { 
        	horarios.add(new SelectItem(h, h.getTipo()));  
        }  
          
        return horarios;	
	}
	
	public Consulta getConsulta() {
		return consulta;
	}

	public void setConsulta(Consulta consulta) {
		this.consulta = consulta;
	}

	public String novoConsulta(){
		setConsulta(new Consulta());
		return "consulta";
	}

	public Integer getMedicoSelecionado() {
		return medicoSelecionado;
	}

	public void setMedicoSelecionado(Integer medicoSelecionado) {
		this.medicoSelecionado = medicoSelecionado;
	}
	
	public Boolean getAgendada(){
		if(consulta.getStatus() != null && consulta.getStatus().equals(StatusConsulta.AGENDADA))
			return true;
		else return false;
	}
	
	public Boolean getConfirmada(){
		if(consulta.getStatus() != null && consulta.getStatus().equals(StatusConsulta.CONFIRMADA))
			return true;
		else return false;
	}

	public boolean isStatusConfirmar() {
		return statusConfirmar;
	}

	public void setStatusConfirmar(boolean statusConfirmar) {
		this.statusConfirmar = statusConfirmar;
	}
	
	private boolean validaDataHorario() {   	      	 
	   	 
		 List<Consulta> listaDeConsultasNoMesmoDia = consultaRN.getByMedicoAndDate(consulta.getMedico().getIdUsuario(), consulta.getDataConsulta());
		 
		 for (Consulta consultaNoMesmoDia : listaDeConsultasNoMesmoDia) {
				if(consultaNoMesmoDia.getHoraConsulta().equals(consulta.getHoraConsulta()))
				{
					return false;
				}
		}
		 
//		 if (listaDeConsultasNoMesmoDia.contains(consulta.getHoraConsulta()))
//			 return false;
    		
       return true;
  }



}
